from scipy import stats
import numpy as np

# 计算题目拟合指标


def p_mat(l_0,l_z,l_s,I):
    """根据累积概率密度函数获取P值

    Args:
        l_0 (array): 后验,shape=(chains_num,iter,n)
        l_z (array): 后验,shape=(chains_num,iter,n)
        l_s (array): 后验,shape=(chains_num,iter,n)
        I (int): 题目个数

    Returns:
        array: mcmc所计算得到的后验P值分布的均值
    """
    z_p = stats.norm(0,1).cdf(l_z).mean(axis=0).mean(axis=0)
    o_p = stats.chi2(I-1).cdf(l_0).mean(axis=0).mean(axis=0)
    s_p = stats.norm(0,1).cdf(l_s).mean(axis=0).mean(axis=0)
    return o_p,z_p,s_p


def get_specific_sensitive(confusion_mat):
    """根据混淆矩阵计算特异性和敏感性

    Args:
        confusion_mat (array): 混淆矩阵,shape=(cat_num,cat_num)

    Returns:
        float: 敏感性和特异性
    """
    indicator = confusion_mat*np.eye(2)/confusion_mat.sum(axis=1)
    # 敏感性 特异性
    return indicator[0,0],indicator[1,1]


def p_to_flag_pre(p_values,alpha):
    """根据特定的P值阈限alpha,标记可能的异常作答

    Args:
        p_values (array)): 每个人的P值,shape=(N,)
        alpha (float): P值阈限alpha

    Returns:
        array: 是否异常,shape=(N,)
    """
    return [p>(1-alpha) for p in p_values]
